import { QuestionType, ContestStatus, ContestRuleType, ContestType } from '@/types';

// 映射项接口定义
export interface MappingItem {
  text: string;
  color?: string;
  value?: any;
}

// 用户类型映射
export const ADMIN_TYPE_MAP: Record<string, string> = {
  'Regular User': '普通用户',
  'Admin': '普通管理员',
  'Super Admin': '超级管理员'
};

// 问题权限映射
export const PROBLEM_PERMISSION_MAP: Record<string, string> = {
  'None': '无权限',
  'Own': '仅自己的题目',
  'All': '所有题目'
};

// 问题类型映射
export const QUESTION_TYPE_MAP: Record<QuestionType, MappingItem> = {
  'single': { text: '单选题', color: 'blue' },
  'multiple': { text: '多选题', color: 'purple' },
  'true_false': { text: '判断题', color: 'orange' },
  'code_reading': { text: '编程题', color: 'red' }
};

// 问题类型选项（用于表单）
export const QUESTION_TYPE_OPTIONS = [
  { label: '单选题', value: 'single' as QuestionType },
  { label: '多选题', value: 'multiple' as QuestionType },
  { label: '判断题', value: 'true_false' as QuestionType },
  { label: '程序阅读题', value: 'code_reading' as QuestionType }
];

// 难度映射
export const DIFFICULTY_MAP: Record<string, MappingItem> = {
  'Low': { text: '简单', color: 'green' },
  'Mid': { text: '中等', color: 'orange' },
  'High': { text: '困难', color: 'red' }
};

// 难度选项（用于表单）
export const DIFFICULTY_OPTIONS = [
  { label: '简单', value: 'Low' },
  { label: '中等', value: 'Mid' },
  { label: '困难', value: 'High' }
];

// 比赛状态映射
export const CONTEST_STATUS_MAP: Record<ContestStatus, MappingItem> = {
  '1': { text: '未开始', color: 'blue' },
  '0': { text: '进行中', color: 'green' },
  '-1': { text: '已结束', color: 'gray' }
};

// 比赛状态选项（用于表单）
export const CONTEST_STATUS_OPTIONS = [
  { label: '未开始', value: '1' as ContestStatus },
  { label: '进行中', value: '0' as ContestStatus },
  { label: '已结束', value: '-1' as ContestStatus }
];

// 比赛规则类型映射
export const CONTEST_RULE_TYPE_MAP: Record<ContestRuleType, MappingItem> = {
  'ACM': { text: 'ACM', color: 'red' },
  'OI': { text: 'OI', color: 'purple' }
};

// 比赛规则类型选项（用于表单）
export const CONTEST_RULE_TYPE_OPTIONS = [
  { label: 'ACM', value: 'ACM' as ContestRuleType },
  { label: 'OI', value: 'OI' as ContestRuleType }
];

// 比赛类型映射
export const CONTEST_TYPE_MAP: Record<ContestType, MappingItem> = {
  'Public': { text: '公开', color: 'green' },
  'Password Protected': { text: '密码保护', color: 'orange' }
};

// 比赛类型选项（用于表单）
export const CONTEST_TYPE_OPTIONS = [
  { label: '公开', value: 'Public' as ContestType },
  { label: '密码保护', value: 'Password Protected' as ContestType }
];

// 编程语言映射（显示用）
export const PROGRAMMING_LANGUAGE_MAP: Record<string, string> = {
  'C': 'C',
  'C++': 'C++',
  'Java': 'Java',
  'Python3': 'Python3',
  'JavaScript': 'JavaScript',
  'Golang': 'Go'
};

// 编程语言选项（用于表单）
export const PROGRAMMING_LANGUAGE_OPTIONS = [
  { label: 'C', value: 'C' },
  { label: 'C++', value: 'C++' },
  { label: 'Java', value: 'Java' },
  { label: 'Python3 (Python 3.11)', value: 'Python3' },
  { label: 'Golang (Go 1.19)', value: 'Golang' },
  { label: 'JavaScript (Node.js 20)', value: 'JavaScript' }
];

// Monaco编辑器语言映射
export const MONACO_LANGUAGE_MAP: Record<string, string> = {
  'C': 'c',
  'C++': 'cpp',
  'Java': 'java',
  'Python3': 'python',
  'JavaScript': 'javascript',
  'Golang': 'go'
};

// 用户状态映射
export const USER_STATUS_MAP: Record<string, MappingItem> = {
  'active': { text: '正常', color: 'green' },
  'disabled': { text: '禁用', color: 'red' },
  'pending': { text: '待审核', color: 'orange' }
};

// ================== 判题/提交结果相关映射 ==================

// 提交结果状态码常量
export const SUBMISSION_STATUS = {
  COMPILE_ERROR: -2,        // 编译错误
  WRONG_ANSWER: -1,         // 答案错误
  ACCEPTED: 0,              // 通过
  CPU_TIME_LIMIT_EXCEEDED: 1, // CPU时间超限
  REAL_TIME_LIMIT_EXCEEDED: 2, // 实际时间超限
  MEMORY_LIMIT_EXCEEDED: 3, // 内存超限
  RUNTIME_ERROR: 4,         // 运行时错误
  SYSTEM_ERROR: 5,          // 系统错误
  PENDING: 6,               // 等待评测
  JUDGING: 7,               // 评测中
  PARTIALLY_ACCEPTED: 8     // 部分通过(OI模式)
};

// 状态码对应的文字描述
export const STATUS_TEXT: Record<number, string> = {
  [-2]: '编译错误',
  [-1]: '答案错误',
  [0]: '通过',
  [1]: 'CPU时间超限',
  [2]: '实际时间超限',
  [3]: '内存超限',
  [4]: '运行时错误',
  [5]: '系统错误',
  [6]: '等待评测',
  [7]: '评测中',
  [8]: '部分通过'
};

// 状态码对应的颜色
export const STATUS_COLOR: Record<number, string> = {
  [-2]: 'pink',     // 编译错误
  [-1]: 'error',    // 答案错误
  [0]: 'success',   // 通过
  [1]: 'orange',    // CPU时间超限
  [2]: 'orange',    // 实际时间超限
  [3]: 'purple',    // 内存超限
  [4]: 'warning',   // 运行时错误
  [5]: 'error',     // 系统错误
  [6]: 'default',   // 等待评测
  [7]: 'processing', // 评测中
  [8]: 'blue'       // 部分通过
};

// 测试点结果码对应的标签文字
export const CASE_RESULT_TAG: Record<number, string> = {
  [-2]: 'CE',   // 编译错误
  [-1]: 'WA',   // 答案错误
  [0]: 'AC',    // 通过
  [1]: 'TLE',   // CPU时间超限
  [2]: 'TLE',   // 实际时间超限
  [3]: 'MLE',   // 内存超限
  [4]: 'RE',    // 运行时错误
  [5]: 'SE',    // 系统错误
  [6]: '...',   // 等待评测
  [7]: '...',   // 评测中
  [8]: 'PA'     // 部分通过
};

// 测试点结果码对应的背景颜色
export const CASE_RESULT_BG_COLOR: Record<number, string> = {
  [-2]: '#ffa7ba',   // 编译错误 - 粉色
  [-1]: '#ff4d4f',   // 答案错误 - 红色
  [0]: '#52c41a',    // 通过 - 绿色
  [1]: '#000000',    // CPU时间超限 - 黑色
  [2]: '#000000',    // 实际时间超限 - 黑色
  [3]: '#000000',    // 内存超限 - 黑色
  [4]: '#722ed1',    // 运行时错误 - 紫色
  [5]: '#ff4d4f',    // 系统错误 - 红色
  [6]: '#d9d9d9',    // 等待评测 - 灰色
  [7]: '#1890ff',    // 评测中 - 蓝色
  [8]: '#13c2c2'     // 部分通过 - 青色
};

// 测试点结果码对应的文本颜色
export const CASE_RESULT_TEXT_COLOR: Record<number, string> = {
  [-2]: '#000000',   // 编译错误 - 黑色
  [-1]: '#ffffff',   // 答案错误 - 白色
  [0]: '#ffffff',    // 通过 - 白色
  [1]: '#ffffff',    // CPU时间超限 - 白色
  [2]: '#ffffff',    // 实际时间超限 - 白色
  [3]: '#ffffff',    // 内存超限 - 白色
  [4]: '#ffffff',    // 运行时错误 - 白色
  [5]: '#ffffff',    // 系统错误 - 白色
  [6]: '#000000',    // 等待评测 - 黑色
  [7]: '#ffffff',    // 评测中 - 白色
  [8]: '#ffffff'     // 部分通过 - 白色
};

// 工具函数：根据映射获取显示文本
export const getDisplayText = (map: Record<string, string | MappingItem>, key: string): string => {
  const value = map[key];
  if (typeof value === 'string') {
    return value;
  }
  return value?.text || key || '未知';
};

// 工具函数：根据映射获取颜色
export const getDisplayColor = (map: Record<string, MappingItem>, key: string): string => {
  const value = map[key];
  return value?.color || 'default';
};

// 工具函数：根据映射获取完整的映射项
export const getMappingItem = (map: Record<string, MappingItem>, key: string): MappingItem => {
  return map[key] || { text: key || '未知', color: 'default' };
}; 

// 全局内存单位转换函数：字节转MB并返回字符串
export function formatMemoryMB(bytes?: number | null): string {
  if (typeof bytes !== 'number' || isNaN(bytes)) return '0.00 KB';
  return `${(bytes / (8 *1024)).toFixed(0)} KB`;
}

// ================== 内容管理相关映射 ==================

// 栏目类型映射（如有需要可扩展）
export const COLUMN_TYPE_MAP = {
  default: { text: '默认栏目', color: 'blue' },
};

// 文章发布状态映射
export const ARTICLE_STATUS_MAP = {
  true: { text: '已发布', color: 'green' },
  false: { text: '未发布', color: 'orange' },
};

// 文章状态选项（用于表单）
export const ARTICLE_STATUS_OPTIONS = [
  { label: '已发布', value: true },
  { label: '未发布', value: false },
]; 